package com.hcy;

import com.jch.Dao.UserDao;
import com.entity.User;
import com.jch.Index;


import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainFrame extends JFrame {

    //面板分割
    private JPanel jp_north;//面板_北部  jp_top
    private JScrollPane jsp_center;//滚动面板_中部 jsp_middle
    private JPanel jp_south;//面板_南部 jp_bottom

    private Cursor hand = new Cursor(Cursor.HAND_CURSOR);
    //北部面板组件
    private JButton jbt_add;//增加按钮
    private JButton jbt_delete;//删除按钮
    private JButton jbt_update;//更新按钮
    private JButton jbt_flush;//刷新按钮
    private JButton jbt_other;//其他按钮
    private JButton jbt_return;//返回登陆按钮

    //中部的组件
    private JTable jt_showData;//显示数据的表格
    public JTable getJt_showData() {
        return jt_showData;
    }

    //列名
    private String[] columnNames = {"编号","用户名","密码","余额","管理员","电话"};

    //南部面板的组件
    private JButton jbt_preview;//上一页
    private JLabel jl_showPages;//显示分页数据
    public JLabel getJl_showPages() {
        return jl_showPages;
    }
    private JButton jbt_next;//下一页

    //分页参数
    private int pn = 1;//当前页
    public int getPn() {
        return pn;
    }
    public void setPn(int pn) {
        this.pn = pn;
    }
    private int pages;//页数
    private int totalCount;//总数据条数
    private int limit = 10;
    public int getPages() {
        return pages;
    }
    public int getTotalCount() {
        return totalCount;
    }
    public int getLimit() {
        return limit;
    }

    //存放每一页数据的map集合
    private Map<Integer, List<User>> pnMap = new HashMap<>();

    //存放当前页的集合
    private List<User> pnList = new ArrayList<>();
    public List<User> getPnList() {
        return pnList;
    }

    //创建userDao对象
    private UserDao userDao = new UserDao();
    public UserDao getUserDao() {
        return userDao;
    }

    private User pnUser;
    public User getPnUser() {
        return pnUser;
    }
    public void setPnUser(User pnUser) {
        this.pnUser = pnUser;
    }

    public MainFrame() {
        //2.分割面板
        //将窗口分割为上中下三部分
        //2.1 设置主窗口为边界布局
        setLayout(new BorderLayout());
        //2.2 增加三部分面板
        //北部
        jp_north = new JPanel();
        //Border：边界  LineBorder：边线 thickness:厚度，粗
        //jp_north.setBorder(new LineBorder(Color.RED, 2));
        //设置布局
        jp_north.setLayout(new FlowLayout(FlowLayout.CENTER, 110, 20));
        //设置北部的尺寸
        //设置尺寸setSize()无法设置边界布局宽高
        //setPreferredSize()强制设置宽高
        jp_north.setPreferredSize(new Dimension(800, 120));
        //加入到面板中
        add(jp_north, BorderLayout.NORTH);

        //创建一个监听对象
        ButtonListener btListener = new ButtonListener(this);
        //北部的几个按钮
        //增加
        jbt_add = new JButton("增加");
        //自己写的样式
        setButtonStyle(jbt_add);
        //增加按钮的活动监听
        jbt_add.addActionListener(btListener);
        jp_north.add(jbt_add);

        //删除
        jbt_delete = new JButton("删除");
        setButtonStyle(jbt_delete);
        jbt_delete.addActionListener(btListener);
        jp_north.add(jbt_delete);

        //更新
        jbt_update = new JButton("更新");
        setButtonStyle(jbt_update);
        jbt_update.addActionListener(btListener);
        jp_north.add(jbt_update);

        //刷新
        jbt_flush = new JButton("刷新");
        setButtonStyle(jbt_flush);
        jbt_flush.addActionListener(btListener);
        jp_north.add(jbt_flush);

        jbt_other = new JButton("其他管理界面");
        setButtonStyle(jbt_other);
        jbt_other.addActionListener(btListener);
        jbt_other.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {

                new BoundaryFrame();

                dispose();
            }
        });
        jp_north.add(jbt_other);


        jbt_return = new JButton("返回登录界面");
        setButtonStyle(jbt_return);
        jbt_return.addActionListener(btListener);
        jbt_return.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new Index();
                dispose();
            }
        });
        jp_north.add(jbt_return);




        //创建一个表格
        jt_showData = new JTable(){
            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
        JTableHeader header = jt_showData.getTableHeader();
        header.setFont(new Font("楷体", Font.PLAIN, 16));
        header.setForeground(Color.MAGENTA);
        //设置单元格的样式
        DefaultTableCellRenderer r = new DefaultTableCellRenderer();
        //表格内容居中
        r.setHorizontalAlignment(JLabel.CENTER);
        jt_showData.setDefaultRenderer(Object.class, r);
        jt_showData.setRowHeight(30);//设置表格高度
        //设置表格字体样式
        jt_showData.setFont(new Font("楷体", Font.PLAIN, 16));

        //中部
        //将jt_showData加入到滚动面板中
        jsp_center = new JScrollPane(jt_showData);
        //jsp_center.setBorder(new LineBorder(Color.GREEN, 2));
        //jsp_center.setPreferredSize(new Dimension(0,400));
        add(jsp_center, BorderLayout.CENTER);

        //南部
        jp_south = new JPanel();
        //jp_south.setBorder(new LineBorder(Color.BLUE, 2));
        jp_south.setPreferredSize(new Dimension(800, 80));
        //流式布局
        jp_south.setLayout(new FlowLayout(FlowLayout.CENTER, 80, 20));
        add(jp_south, BorderLayout.SOUTH);

        //南部的几个组件
        //上一页
        jbt_preview = new JButton("上一页");
        setButtonStyle(jbt_preview);
        jbt_preview.addActionListener(btListener);
        jp_south.add(jbt_preview);

        //中间部分
        jl_showPages = new JLabel("当前【0】页 / 共【0】页");
        jl_showPages.setFont(new Font("微软雅黑", Font.BOLD, 18));
        jp_south.add(jl_showPages);

        //下一页
        jbt_next = new JButton("下一页");
        setButtonStyle(jbt_next);
        jbt_next.addActionListener(btListener);
        jp_south.add(jbt_next);

        //刷新数据
        flushUsers();
        //显示数据
        showUsers();

        //1.先把窗口显示出来
        //标题 
        setTitle("用户名增删改查");
        //尺寸
        setSize(800,600);
        //居中
        setLocationRelativeTo(null);
        //设置关闭模式。直接结束整个程序
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //设置可见
        setVisible(true);
    }

    /**
     * 刷新数据，将数据存储到map集合中
     */
    public void flushUsers() {
        List<User> users = userDao.queryUsers();

        //总数据条数
        totalCount = users.size();
        //总页数
        pages = totalCount / limit;
        pages = totalCount % limit != 0?pages+1:pages;

        //循环将每一页存储到map集合中
        //创建一个总数居的下标变量
        int n = 0;
        //如果最后一页不够limit
        int pnCount = limit;
        for (int i = 0; i < pages; i++) {
            List<User> currList = new ArrayList<>();
            if (i == pages -1 && totalCount % limit != 0) {
                //到了最后一页，得到最后一页的数量
                pnCount = totalCount % limit;
            }
            //取到每一页数据
            for (int j = 0; j < pnCount; j++, n++) {
                currList.add(users.get(n));
            }
            //将每一行数据存储到map集合中
            pnMap.put(i + 1, currList);
        }
    }

    /**
     * 查询所有用户数据并显示
     */
    public void showUsers() {
        //取出当前页数据
        pnList = pnMap.get(pn);
        Object[][] data = listToArray(pnList);
        jt_showData.setModel(new DefaultTableModel(data, columnNames));
        //设置中间标签显示部分
        jl_showPages.setText("当前【"+pn+"】页 / 共【"+pages+"】页");

        jbt_preview.setEnabled(pn>1);
        jbt_next.setEnabled(pn<pages);
    }

    /**
     * 将集合转化为二维数组
     * @param users
     * @return
     */
    public Object[][] listToArray(List<User> users) {
        //创建一个指定行数的二维数组
        Object[][] data = new Object[users.size()][];
        for (int i = 0; i < users.size(); i++) {
            User user = users.get(i);
            //每一行数据的长度与表头一致
            Object[] userData = {user.getUid(),user.getuName(), user.getuPass()
                    ,user.getBalance(),user.getuType(),user.getUphone()};
            //将这个一维数组放入二维数组
            data[i] = userData;
        }
        return data;
    }

    //修改按钮样式
    public void setButtonStyle(JButton button) {
        button.setSize(50, 50);
        button.setFont(new Font("微软雅黑", Font.BOLD, 20));
        button.setBackground(Color.LIGHT_GRAY);
        button.setCursor(hand);
    }

    public static void main(String[] args) {
        new MainFrame();
    }

}
